package negModel;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import negModelExcep.eSinFondos;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import org.apache.xerces.parsers.DOMParser;
import org.apache.xml.serialize.XMLSerializer;
import org.apache.xml.serialize.OutputFormat;

public class PersonajeJugador extends Personaje {
	
	private String Nombre;
	private AlgoPesos Dinero;
	private ListaVehiculos listaDeVehiculos;
	private Vehiculo vehiculoActual;
	private ListaPartes lpu;
	private ListaPartes lpn;
	
	public PersonajeJugador(String s, double d, Vehiculo v){
		
		
		Nombre = s;
		Dinero = new AlgoPesos(d);
		lpu = new ListaPartes();
		lpn = new ListaPartes();
		listaDeVehiculos=new ListaVehiculos();
		this.AgregarVehiculo(v);
	}
	
	public PersonajeJugador(Element xmlElement) {
		
		this.Nombre=xmlElement.getAttribute("nombre");
		this.Dinero=(new AlgoPesos(Double.parseDouble(xmlElement.getAttribute("dinero"))));
		
		listaDeVehiculos=new ListaVehiculos();
		
		NodeList nodoslista=xmlElement.getElementsByTagName("listaVehiculos");
		for(int nlv=0;nlv<nodoslista.getLength();nlv++){
			listaDeVehiculos.RecuperarXml((Element)nodoslista.item(nlv));
		}
		
		this.vehiculoActual = (Vehiculo)listaDeVehiculos.get(0);
				
		lpu = new ListaPartes();
		
		nodoslista=xmlElement.getElementsByTagName("UlistaParte");
		for(int nl=0;nl<nodoslista.getLength();nl++){
			lpu.RecuperarXml((Element)nodoslista.item(nl));
			}	
	
		lpn = new ListaPartes();
		
		nodoslista=xmlElement.getElementsByTagName("NlistaParte");
		for(int nl=0;nl<nodoslista.getLength();nl++){
			lpn.RecuperarXml((Element)nodoslista.item(nl));
		
				
			}
				
		
	}
	
	public Element toXml(Document doc){
		Element xmlElement = doc.createElement("personaje");
		xmlElement.setAttribute("Clase","jugador");
		
		xmlElement.setAttribute("nombre", this.Nombre);
		xmlElement.setAttribute("dinero", ""+((this.Dinero).getMonto()));
						
	//	xmlElement.appendChild(this.vehiculoActual.toXml(doc));
		xmlElement.appendChild(this.listaDeVehiculos.toXml(doc,""));
		xmlElement.appendChild(this.lpu.toXml(doc,"U"));
		xmlElement.appendChild(this.lpn.toXml(doc,"N"));
					
		return xmlElement;
	}
	
	public static void guardar(String nombreArchivo,PersonajeJugador jug ) throws IOException, ParserConfigurationException{
	    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	    DocumentBuilder loader = factory.newDocumentBuilder();
        Document doc = loader.newDocument();

        
        doc.appendChild(jug.toXml(doc));
        
        XMLSerializer serializer = new XMLSerializer();
        
        OutputFormat outFormat = new OutputFormat();

       
        outFormat.setVersion("1.0");
        outFormat.setIndenting(true);
        outFormat.setIndent(4);
        
        serializer.setOutputFormat(outFormat);
        serializer.setOutputCharStream(
          new java.io.FileWriter(nombreArchivo));
        serializer.serialize(doc);
	}
	
	public static PersonajeJugador cargar (String nombreArchivo) throws IOException, ClassNotFoundException	{
		DOMParser parser = new DOMParser();

		try {
		    parser.parse(nombreArchivo);

		} catch (SAXException se) {
		    se.printStackTrace();
		} catch (IOException ioe) {
		    ioe.printStackTrace();
		}

		Document docXml = parser.getDocument();
		
		return new PersonajeJugador(docXml.getDocumentElement());

	}
	
	public String getNombre (){
		return Nombre;
	}
	
	public String getDinero (){
		return Dinero.toString();
	}
	
	public AlgoPesos getAlgoPesos(){
		return Dinero;
	}
	
	public void pagar(double m) throws eSinFondos{
		try{
			this.Dinero.sacarMonto(m);
		}catch(eSinFondos e){
			throw e;
		}
	}
	
	public void sumar(double m){
		this.Dinero.agregarMonto(m);
	}
	
	public void agregarParteNueva(Parte p){
		lpn.add(p);
	}
	
	public void agregarParteUsada(Parte p){
		lpu.add(p);
	}
	
	public ListaPartes getPartesNuevas(){
		return lpn;		
	}
	
	public ListaPartes getPartesUsadas(){
		return lpu;
	}
	
	public ListaVehiculos mostrarVehiculos(){
		return listaDeVehiculos;
	}
	
	public Vehiculo getVehiculo(){
		return vehiculoActual;
	}
	
	public void AgregarVehiculo(Vehiculo veh){
		this.vehiculoActual = veh;
		listaDeVehiculos.add(veh);
	}
	
	public void SetVehiculo(Vehiculo veh){
		this.vehiculoActual = veh;
	}
	

}
